package com.king.designpatterns.行为模式.迭代器模式;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector;

/**
 * 迭代器模式（Iterator Pattern）是最常被使用的几个模式之一，被广泛地应用到 Java 的API中。
 * 例如，Java的集合（Collection）框架中，就广泛使用迭代器来遍历集合中的元素。
 *
 * 定义：提供一种方法访问一个容器对象中各个元素，而又不需暴露该对象的内部细节。
 *
 * 角色：
 *      ■ 抽象迭代器（Iterator）角色：
 *          该角色负责定义访问和遍历元素的接口。
 *      ■ 具体迭代器（Concrete Iterator）角色：
 *          该角色实现Iterator接口，完成容器元素的遍历。
 *      ■ 抽象聚集（Aggregate）角色：
 *          该角色提供创建迭代器角色的接口。
 *      ■ 具体聚集（Concrete Aggregate）角色：
 *          该角色实现抽象聚集接口，创建出容纳迭代器的对象。
 *
 * 优缺点：
 *      优点：
 *          ■ 迭代器模式简化了访问容器元素的操作，具备一个统一的遍历接口。
 *          ■ 封装遍历算法，使算法独立于聚集角色。客户无须知道聚集对象的类型，即使聚集对象的类型发生变化，也不会影响遍历过程。
 *      缺点：
 *          ■ 迭代器模式给使用者一个序列化的错觉，从而产生错误。
 *          ■ 迭代器的元素都是Object类型，没有类型特征（JDK1.5后通过引入泛型可以解决此问题）。
 *
 * 场景：
 *      在Java语言中，从JDK1.2版本开始，增加了java.util.Iterator接口，并将Iterator应用到各个聚集类（Collection）中，
 *      如ArrayList、Vector、Stack、HashSet 等集合类都实现了 iterator()方法，返回一个迭代器 Iterator，便于对集合中的元素进行遍历。
 *
 * @author king
 * @date 2021-06-10 16:48
 */
public class IteratorPattern {
    public static void main(String[] args) {
        // 定义一个向量集合
        Vector<Object> vector = new Vector<>();
        vector.add("向量1");
        vector.add("向量2");
        vector.add("向量3");
        vector.add("向量4");

        // 定义一个序列
        ArrayList<Object> list = new ArrayList<>();
        list.add("序列1");
        list.add("序列2");
        list.add("序列3");

        // 定义栈
        Stack<Object> stack = new Stack<>();
        stack.push("A");
        stack.push("B");
        stack.push("C");
        stack.push("D");
        stack.push("E");

        // 遍历集合
        Iterator<Object> iterator = vector.iterator();
        System.out.println("遍历向量中的元素：");
        show(iterator);
        System.out.println("\n\n遍历序列中的元素");
        show(list.iterator());
        System.out.println("\n\n遍历栈中的元素：");
        show(stack.iterator());
    }

    private static void show(Iterator iterator){
        while(iterator.hasNext()){
            System.out.println(iterator.next() + " ");
        }
    }
}
